﻿using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;

namespace XRealEngine.Framework.Graphics
{
    //////////////////////////////////////////////////////////////////////////////////////////////////// 
    /// <summary>
    /// The definition of a sprite
    /// </summary>
    //////////////////////////////////////////////////////////////////////////////////////////////////// 
    public class SpriteDefinition
    {
        #region Fields

        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        /// <summary>The name of the sprite</summary>
        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        [ContentSerializer(ElementName="Name")]
        private string name;

        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        /// <summary>The boundaries of the sprite in the sprites sheet</summary>
        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        [ContentSerializer(ElementName = "Rectangle")]
        private Rectangle rectangle;

        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        /// <summary>The boundaries of the sprite in the sprites sheet</summary>
        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        [ContentSerializer(ElementName = "Texture")]
        private Texture2D texture;
        
        #endregion

        #region Properties

        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        /// <summary>Gets / Sets the name of the sprite</summary>
        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        [ContentSerializerIgnore]
        public string Name
        {
            get 
            { 
                return name; 
            }
            internal set 
            {
                name = value;
            }
        }

        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        /// <summary>Gets / Sets the texture of the sprite definition</summary>
        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        [ContentSerializerIgnore]
        public Texture2D Texture
        {
            get
            {
                return texture;
            }
            internal set
            {
                texture = value;
            }
        }

        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        /// <summary>Gets / Sets the boundaries of the sprite in the sprites sheet</summary>
        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        [ContentSerializerIgnore]
        public  Rectangle Rectangle 
        {
            get { return rectangle; }
            set { rectangle = value; }
        }

        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        /// <summary>Gets / Sets the width of the sprite in the sprites sheet</summary>
        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        [ContentSerializerIgnore]
        public int Width
        {
            get { return rectangle.Width; }
            set { rectangle.Width = value; }
        }

        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        /// <summary>Gets / Sets the height of the sprite in the sprites sheet</summary>
        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        [ContentSerializerIgnore]
        public int Height
        {
            get { return rectangle.Height; }
            set { rectangle.Height = value; }
        }

        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        /// <summary>Gets / Sets the position (X coordinates) of the sprite in the sprites sheet</summary>
        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        [ContentSerializerIgnore]
        public int X
        {
            get { return rectangle.X; }
            set { rectangle.X = value; }
        }

        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        /// <summary>Gets / Sets the position (Y coordinates) of the sprite in the sprites sheet</summary>
        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        [ContentSerializerIgnore]
        public int Y
        {
            get { return rectangle.Y; }
            set { rectangle.Y = value; }
        }

        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        /// <summary>Gets / Sets the right coordinate of the sprite in the sprites sheet</summary>
        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        [ContentSerializerIgnore]
        public int Right
        {
            get { return rectangle.Right; }
            set { rectangle.Width = value - rectangle.X; }
        }

        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        /// <summary>Gets / Sets the bottom coordinate of the sprite in the sprites sheet</summary>
        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        [ContentSerializerIgnore]
        public int Bottom
        {
            get { return rectangle.Bottom; }
            set { rectangle.Height = value - rectangle.Y; }
        }

        #endregion

        #region Contructor

        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        /// <summary>
        /// Create a new sprite definition
        /// </summary>
        /// <param name="name">The name of the sprite definition</param>
        /// <param name="rect">The position and dimensions of the sprite on a sprites sheet</param>
        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        public SpriteDefinition(string name, Rectangle rect)
        {
            this.name = name;
            this.rectangle = rect;
        }

        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        /// <summary>
        /// Create a new sprite definition
        /// </summary>
        //////////////////////////////////////////////////////////////////////////////////////////////////// 
        public SpriteDefinition()
        {
        }

        #endregion
    }
}
